#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <chrono>
#include <sw/redis++/redis++.h> 
#include "util.hpp"

void test1(sw::redis::Redis &redis)
{
    std::cout << "hset And hget 的使用" << std::endl;
    redis.flushall();

    redis.hset("key", "f1", "111");
    redis.hset("key", {std::make_pair("f2", "222"), std::make_pair("f3", "333")});

    std::vector<std::pair<std::string, std::string>> fields = {
        {"f4", "444"},
        {"f5", "555"}
    };

    redis.hset("key", fields.begin(), fields.end());

    auto result = redis.hget("key", "f1");
    if(result) {
        std::cout << "result: " << result.value() << std::endl;
    } else {
        std::cout << "result 无效" << std::endl;
    }
}

void test2(sw::redis::Redis &redis)
{
    std::cout << "hexists 的使用" << std::endl;
    redis.flushall();

    redis.hset("key", "f1", "111");
    redis.hset("key", "f2", "222");
    redis.hset("key", "f2", "333");


    bool result = redis.hexists("key", "f1");
    std::cout << "result: " << result << std::endl;
}

void test3(sw::redis::Redis &redis)
{
    std::cout << "hdel 的使用" << std::endl;
    redis.flushall();

    redis.hset("key", "f1", "111");
    redis.hset("key", "f2", "222");
    redis.hset("key", "f3", "333");


    long long result = redis.hdel("key", {"f1", "f2"});
    std::cout << "result: " << result << std::endl;
}

void test4(sw::redis::Redis &redis)
{
    std::cout << "hlen 的使用" << std::endl;
    redis.flushall();

    redis.hset("key", "f1", "111");
    redis.hset("key", "f2", "222");
    redis.hset("key", "f3", "333");


    long long len = redis.hlen("key");
    std::cout << "result: " << len << std::endl;
}

void test5(sw::redis::Redis &redis)
{
    std::cout << "hkeys And hvals 的使用" << std::endl;
    redis.flushall();

    redis.hset("key", "f1", "111");
    redis.hset("key", "f2", "222");
    redis.hset("key", "f3", "333");


    std::vector<std::string> fields;
    auto itFields = std::back_inserter(fields);
    redis.hkeys("key", itFields);

    printContainer(fields);

    std::vector<std::string> values;
    auto itValues = std::back_inserter(values);
    redis.hkeys("key", itValues);

    printContainer(values);
}

void test6(sw::redis::Redis &redis)
{
    std::cout << "hmset And hmget 的使用" << std::endl;
    redis.flushall();

    redis.hmset("key", {
        std::make_pair("f1", "111"),
        std::make_pair("f2", "222"),
        std::make_pair("f3", "333")
    });

    std::vector<std::string> values;
    auto it = std::back_inserter(values);
    redis.hmget("key", {"f1", "f2", "f3"}, it);

    printContainer(values);
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");

    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    // test5(redis);
    test6(redis);


    return 0;
}